﻿#include<stdbool.h>
#include<stdio.h>

//给定两个整数 left 和 right ，返回一个列表，列表的元素是范围 [left, right] 内所有的 自除数
bool isselfd(int num)
{
    int copy = num;
    while (copy > 0)
    {
        int a = copy % 10;
        if (a == 0 || num % a != 0)
        {
            return false;
        }
        copy /= 10;
    }
    return true;
}
int* selfDividingNumbers(int left, int right, int* returnSize)
{
    int* ret = (int*)malloc(sizeof(int) * (right - left + 1));
    int count = 0;
    //遍历left到right
    for (int i = left; i <= right; i++)
    {
        //判断是否为自除数
        if (isselfd(i))
        {
            ret[count] = i;
            count++;
        }
    }
    *returnSize = count;
    return ret;
}




//给你一个整数数组 nums，返回 数组 answer ，其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。
//
//题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在  32 位 整数范围内。
//
//请不要使用除法，且在 O(n) 时间复杂度内完成此题。
int* productExceptSelf(int* nums, int numsSize, int* returnSize)
{
    *returnSize = numsSize;
    int left[numsSize], right[numsSize];
    left[0] = 1, right[numsSize - 1] = 1;
    //除自身左边的数的积
    for (int i = 0; i + 1 < numsSize; i++)
    {
        left[i + 1] = left[i] * nums[i];
    }
    //除自身右边的数的积
    for (int i = numsSize - 1; i > 0; i--)
    {
        right[i - 1] = right[i] * nums[i];
    }

    //乘积
    for (int i = 0; i < numsSize; i++)
    {
        nums[i] = left[i] * right[i];
    }
    return nums;
}